package it.maganar.lesscaos.session;

import it.maganar.lesscaos.entity.Disponibilita;
import it.maganar.lesscaos.entity.Negoziazione;
import it.maganar.lesscaos.entity.Partecipazione;
import it.maganar.lesscaos.entity.User;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * Session Bean implementation class NegoziazioniManagerBean
 * <br>
 * stato = 0 : negoziazione in corso<br>
 * stato = 1 : negoziazione accettata<br>
 * stato = 2 : negoziazione rifiutata<br>
 * <br>
 * turno = 0 : l'issuer deve confermare le condizioni<br>
 * turno = 1 : il requestor deve confermare le condizioni<br>
 */
@SuppressWarnings("unchecked")
@Stateless
public class NegoziazioniManagerBean implements NegoziazioniManagerLocal {

	@PersistenceContext(unitName="lessDB")
	private EntityManager manager;
	
	@Override
	public boolean accettaCondizioni(String nomeUtente, Negoziazione n) {
		User u = manager.find(User.class, nomeUtente);
		n = manager.find(Negoziazione.class, n.getId());
		if ((nomeUtente.equals(n.getIssuer().getNomeUtente()) && n.getTurno() == 1) ||
			(nomeUtente.equals(n.getRequestor().getNomeUtente()) && n.getTurno() == 0))
			return false;
		Partecipazione p = manager.find(Partecipazione.class, n.getProposta().getId());
		u = n.getRequestor();
		u.getListaPartecipazioni().add(p);
		manager.merge(u);
		manager.flush();
		n = manager.find(Negoziazione.class, n.getId());
		n.setStato(1);
		manager.merge(n);
		manager.flush();
		
		return true;
	}

	@Override
	public boolean aggiungiCondizioni(String nomeUtente, Negoziazione n, String c) {
		n = manager.find(Negoziazione.class, n.getId());
		if ((nomeUtente.equals(n.getIssuer().getNomeUtente()) && n.getTurno() == 1) ||
			(nomeUtente.equals(n.getRequestor().getNomeUtente()) && n.getTurno() == 0))
			return false;
		n.setCondizioni(n.getCondizioni() + "$" + c);
		if (n.getTurno() == 0)
			n.setTurno(1);
		else
			n.setTurno(0);
		manager.merge(n);
		manager.flush();
		
		return true;
	}

	/**
	 * ritorna tutte le negoziazioni legate all'utente corrente
	 */
	@Override
	public List ottieniListaNegoziazioni(String nomeUtente) {
		List result = new ArrayList();
		result = manager.createQuery("select N from Negoziazione N where N.issuer.nomeUtente = ?1 or N.requestor.nomeUtente = ?1").setParameter(1, nomeUtente).getResultList();
		return result;
	}

	@Override
	public boolean rifiutaCondizioni(String nomeUtente, Negoziazione n) {
		Partecipazione p = manager.find(Partecipazione.class, n.getProposta().getId());
		n = manager.find(Negoziazione.class, n.getId());
		if ((nomeUtente.equals(n.getIssuer().getNomeUtente()) && n.getTurno() == 1) ||
			(nomeUtente.equals(n.getRequestor().getNomeUtente()) && n.getTurno() == 0))
			return false;
		n = manager.find(Negoziazione.class, n.getId());
		n.setStato(2);
		manager.merge(n);
		manager.flush();
		//incremento di uno il numero di posti disponibili nella disponibilita associata
		if (p.getIscrizione().getNumPosti() < p.getIscrizione().getTipoVeicolo().posti()) {
			Disponibilita d = manager.find(Disponibilita.class, p.getIscrizione().getId());
			d.setNumPosti(d.getNumPosti() + 1);
			manager.persist(d);
			manager.flush();
		}
		
		return true;
	}

}
